package com.own.component.util.excel.util.write.method;

import com.own.component.util.excel.util.write.model.Style;
import com.own.component.util.excel.util.write.record.ExcelRecord;

/**
 * BaseCoordinateMethod
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
public interface BaseCoordinateMethod extends BaseValueMethod {

    /**
     * 设置原点坐标（需要在最初的时候直接调用）
     *
     * @param x x坐标
     * @param y y坐标
     * @return 表格对象
     */
    default ExcelRecord origin(int x, int y) {
        // 最小值为1,1
        x = Math.max(x, 1);
        y = Math.max(y, 1);
        sheet().getOrigin().refresh(x, y);
        setCoordinate(x, y);
        return excel();
    }

    /**
     * 初始化
     *
     * @return 表格对象
     */
    default ExcelRecord init() {
        var origin = sheet().getOrigin();
        setCoordinate(origin.getX(), origin.getY());
        return excel();
    }

    /**
     * 初始化x方向的操作位置
     *
     * @return 表格对象
     */
    default ExcelRecord initX() {
        return moveToX(sheet().getOrigin().getX());
    }

    /**
     * 初始化x方向的操作位置
     *
     * @param x x坐标
     * @return 表格对象
     */
    default ExcelRecord moveToX(int x) {
        var sheet = sheet();
        sheet.getCurrent().setX(Math.max(x, sheet.getOrigin().getX()));
        return excel();
    }

    /**
     * 初始化y方向的操作位置
     *
     * @return 表格对象
     */
    default ExcelRecord initY() {
        return moveToY(sheet().getOrigin().getY());
    }

    /**
     * 初始化y方向的操作位置
     *
     * @param y y坐标
     * @return 表格对象
     */
    default ExcelRecord moveToY(int y) {
        var sheet = sheet();
        sheet.getCurrent().setY(Math.max(y, sheet.getOrigin().getY()));
        return excel();
    }

    /**
     * 跳转操作单元格
     *
     * @param x x跳转格数
     * @param y y跳转格数
     * @return 表格对象
     */
    default ExcelRecord next(int x, int y) {
        return nextX(x).nextY(y);
    }

    /**
     * 跳转操作单元格
     *
     * @return 表格对象
     */
    default ExcelRecord nextX() {
        return nextX(1);
    }

    /**
     * 跳转操作单元格
     *
     * @param number 跳转格数
     * @return 表格对象
     */
    default ExcelRecord nextX(int number) {
        return setCoordinate(sheet().getCurrent().getX() + number, sheet().getCurrent().getY());
    }

    /**
     * 跳转操作单元格
     *
     * @return 表格对象
     */
    default ExcelRecord nextY() {
        return nextY(1);
    }


    /**
     * 跳转操作单元格
     *
     * @param number 跳转格数
     * @return 表格对象
     */
    default ExcelRecord nextY(int number) {
        return setCoordinate(sheet().getCurrent().getX(), sheet().getCurrent().getY() + number);
    }

    /**
     * 向x方向的下一个单元格填充内容
     *
     * @param value 内容
     * @return 表格对象
     */
    default ExcelRecord pushX(Object value) {
        return pushX(value.toString());
    }

    /**
     * 向x方向的下一个单元格填充内容
     *
     * @param value 内容
     * @return 表格对象
     */
    default ExcelRecord pushX(String value) {
        return nextX().setValue(value);
    }

    /**
     * 向x方向的下一个单元格填充内容
     *
     * @param value 内容
     * @param style 样式
     * @return 表格对象
     */
    default ExcelRecord pushX(Object value, Style style) {
        return pushX(value.toString(), style);
    }

    /**
     * 向x方向的下一个单元格填充内容
     *
     * @param value 内容
     * @param style 样式
     * @return 表格对象
     */
    default ExcelRecord pushX(String value, Style style) {
        return nextX().setValue(value, style);
    }

    /**
     * 向y方向的下一个单元格填充内容
     *
     * @param value 内容
     * @return 表格对象
     */
    default ExcelRecord pushY(Object value) {
        return pushY(value.toString());
    }

    /**
     * 向y方向的下一个单元格填充内容
     *
     * @param value 内容
     * @return 表格对象
     */
    default ExcelRecord pushY(String value) {
        return nextY().setValue(value);
    }

    /**
     * 向y方向的下一个单元格填充内容
     *
     * @param value 内容
     * @param style 样式
     * @return 表格对象
     */
    default ExcelRecord pushY(Object value, Style style) {
        return pushY(value.toString(), style);
    }

    /**
     * 向y方向的下一个单元格填充内容
     *
     * @param value 内容
     * @param style 样式
     * @return 表格对象
     */
    default ExcelRecord pushY(String value, Style style) {
        return nextY().setValue(value, style);
    }

}
